package com.dtx.day1;


import org.junit.Test;

import java.lang.reflect.Constructor;

public class ClassLoadTest {
    public static void main(String[] args) throws Exception{
        // 获取 User 的类对象
        Class<User> clz = User.class;

        //快速 通过 无参构造方法 ，创建对象
        User user1 = clz.newInstance();
        System.out.println(user1);

        //JDK1.8后的反射 快速 通过 无参构造方法 ，创建对象
        Object o  = clz.getDeclaredConstructor().newInstance();

        //获取 User类的 所有 构造方法
        Constructor<?>[] constructors = clz.getConstructors();
        //无参构造
        Constructor<?> constructor0 = constructors[0];
        //有参构造
        Constructor<?> constructor1 = constructors[1];
        //获取有参构造参数个数
        int parameterCount = constructor1.getParameterCount();
        System.out.println(parameterCount);
        Class<?>[] parameterTypes = constructor1.getParameterTypes();
        for (Class<?> clzz : parameterTypes) {
            System.out.println(clzz.getName());
        }

        // 通过 构造方法创建对象
        User user = (User) constructor1.newInstance("张三","123");
        user.setName("张三");
        user.setPassword("123");
        System.out.println(user);

    }

    @Test
    public void test3() throws Exception{
        //获取指定的某一个构造方法
        Class<User> clz = User.class;

        // 获取 无参构造
        Constructor<User> declaredConstructor = clz.getDeclaredConstructor();

        //调用无参构造，获取对象
        User user = declaredConstructor.newInstance();

        System.out.println(user);
    }

    @Test
    public void test4() throws Exception{
        //获取指定的某一个构造方法
        Class<User> clz = User.class;

        // 获取 有参构造
        Constructor<User> declaredConstructor = clz.getDeclaredConstructor(String.class,String.class);

        declaredConstructor.setAccessible(true);
        //调用有参构造，获取对象
        User user = declaredConstructor.newInstance("张三","123456");

        System.out.println(user);
    }
}
